/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package WSO;

import beans.AfiliadoBean;
import beans.Bean;
import beans.CartillaProfesionalesBean;
import beans.NovedadBean;
import beans.PrestadoraBean;
import beansSerializable.AfiliadoSerializable;
import beansSerializable.TurnoSerializable;
import daos.Dao;
import daos.DaoFactory;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;

/**
 *
 * @author Cristian
 */
@WebService(serviceName = "OSWS11")
@XmlSeeAlso({AfiliadoSerializable.class})
public class OSWS11 {

   private String db = "dbObraSocial";

   
    
    @WebMethod(operationName = "returnCartilla")
    public String returnCartilla( )
    {
        try {
            Dao dao = DaoFactory.getDao("CartillaProfesionales",db);   
            //List<Bean> lista = dao.select(null);
            ArrayList<Bean> cartillaProfesionales =  (ArrayList<Bean>) dao.select(null);
            //AfiliadoBean a= new AfiliadoBean(1);
           CartillaProfesionalesBean cp = (CartillaProfesionalesBean) cartillaProfesionales.get(0);
            return("Cartilla " + cp.getNombreProfesional() + cp.getApellidoProfesional() + cp.getNombreEspecialidad() +cp.getNombrePrestadora());
            
        } catch (Exception ex) {
            Logger.getLogger(OSWS11.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }



 @WebMethod(operationName = "returnNovedades")
    public String returnNovedades( )
    {
        try {
            Dao dao = DaoFactory.getDao("Novedades",db);   
            ArrayList <Bean> novedad = (ArrayList <Bean>) dao.select(null);
            //AfiliadoBean a= new AfiliadoBean(1);
           NovedadBean n = (NovedadBean)novedad.get(0);
            return("Novedad " + n.getIdNovedad()+ n.getDescripcion() + n.getAutor() + n.getFecha());
            
        } catch (Exception ex) {
            Logger.getLogger(OSWS11.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * This is a sample web service operation
     */
    @WebMethod(operationName = "hello")
    public String hello(@WebParam(name = "name") String txt) {
        return "Hello " + txt + " !";
    }
    
   
    
    @WebMethod(operationName = "login")
    public AfiliadoSerializable login( AfiliadoSerializable  id ) {
        try {
            Dao dao = DaoFactory.getDao("Afiliado");            
            AfiliadoBean a = id.getBean();
            a = (AfiliadoBean) dao.get(a);          
            AfiliadoSerializable as= new AfiliadoSerializable ();
            as.setBean(a);           
            return  as;
        } catch (Exception ex) {
            Logger.getLogger(OSWS11.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    } 
    
    
    @WebMethod(operationName = "buscarTurnos")
    public  List <TurnoSerializable> buscarTurnos( AfiliadoSerializable  id ) {
        Class serviceClass, portClass;
        Object service, port;
        Method metGetPort, metGetTurno;  
        List <TurnoSerializable> listaTurno = new ArrayList<TurnoSerializable>(); 
        try {
            Dao dao = DaoFactory.getDao("Prestdora"); 
            ArrayList<Bean> listaPresdora = (ArrayList<Bean>) dao.select(null); 
            Iterator it = listaPresdora.iterator();
            while(it.hasNext()){
                PrestadoraBean pBean=  (PrestadoraBean) it.next();
                serviceClass = Class.forName("ws."+pBean.getAccesoWS()+"_Service");
                portClass = Class.forName("ws." +pBean.getAccesoWS());
                service = serviceClass.newInstance();
                metGetPort    = serviceClass.getMethod("get"+pBean.getAccesoWS()+"Port", (Class[]) null);                
                Class[] cArg = new Class[1];
                cArg[0] = TurnoSerializable.class;                  
                port   = (Object) metGetPort.invoke(service, (Object[]) null);
                metGetTurno = portClass.getMethod("buscarTurnos", cArg);
                List <TurnoSerializable> aux = new ArrayList<TurnoSerializable>();                 
                listaTurno =  (List<TurnoSerializable>) metGetTurno.invoke(port, (Object) null);
                listaTurno = anexarLista(aux,listaTurno);
            }             
        } catch (Exception ex) { 
            
            System.out.println("Error    " + ex.getMessage());
        }
        finally {
            return listaTurno;
        }       
    } 
    
    private List <TurnoSerializable> anexarLista( List <TurnoSerializable> aux,List <TurnoSerializable> lista){
        Iterator it = aux.iterator();
        while(it.hasNext()) {
            lista.add((TurnoSerializable)it.next());
        }  
             return lista;            
    }
    
    
    
    
}
